﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlServerCe;
using System.Text;

namespace DB
{
    /// <summary>
    /// DB実行ロジッククラス
    /// </summary>
    public class DBLogic : DBAccessor
    {
        #region 定数
        /// <summary>パラメータフォーマット</summary>
        private const string FMT_PAREM = "@{0}";

        #endregion


    #region 


        public struct QueryInfo
        {
            public string sqlFile{ get; set; }

            public Dictionary<string, object>ParaDic{ get; set; }

        }



    #endregion




       #region public

        /// <summary>
        /// データを読み取る
        /// </summary>
        /// <param name="sqlFile">SQLファイル</param>
        /// <param name="paramDic">パラメータ</param>
        /// <returns>読み取り結果データテーブル</returns>
        public static DataTable ExecuteReader(string sqlFile, string[] columns)
        {
            return ExecuteReader(sqlFile,columns,null);
        }



        /// <summary>
        /// データを読み取る
        /// </summary>
        /// <param name="sqlFile">SQLファイル</param>
        /// <param name="paramDic">パラメータ</param>
        /// <returns>読み取り結果データテーブル</returns>
        public static DataTable ExecuteReader(string sqlFile, string[] columns, Dictionary<string, object> paramDic)
        {
            DataTable tb = new DataTable();

            if (String.IsNullOrEmpty(sqlFile) || columns == null || columns.Length <= 0) 
            {
                return tb;
            }

            // カラムの設定
            foreach (var col in columns)
            {
                tb.Columns.Add(col);
            }

            using (var db = Opne())
            {
                // コマンド生成
                SqlCeCommand command = new SqlCeCommand(ReadSQLFile(sqlFile, Encoding.UTF8), db.Con);

                if (paramDic != null && paramDic.Count > 0)
                {
                    // パラメータを作成しコマンドに設定
                    foreach (var key in paramDic.Keys)
                    {
                        command.Parameters.Add(new SqlCeParameter(String.Format(FMT_PAREM, key), paramDic[key]));

                    }
                }

                // 結果データ読み込み
                using (SqlCeDataReader scdr = command.ExecuteReader())
                {
                    // 結果データの表示
                    while (scdr.Read())
                    {
                        DataRow row = tb.NewRow();
                        foreach (var col in columns)
                        {
                            row.SetField(col, scdr[col]);
                        }
                        tb.Rows.Add(row);
                    }
                }
            }

            return tb;
        }

        public static int ExecuteNonQuery(string sqlFile)
        {
            return ExecuteNonQuery(sqlFile,null);
        }


        /// <summary>
        /// クエリを実行する
        /// </summary>
        /// <param name="sqlFile">SQLファイル</param>
        /// <param name="paramDic">パラメータ</param>
        public static int ExecuteNonQuery(string sqlFile, Dictionary<string, object> paramDic)
        {
            if (String.IsNullOrEmpty(sqlFile))
            {
                return 0;
            }

            using (var db = BeginTransactionOpne())
            {
                // コマンド生成
                //SqlCeCommand command = new SqlCeCommand(ReadSQLFile(sqlFile, Encoding.UTF8), db.Con);

                try
                {
                    //実行SQLファイル(トランザクション処理)
                    foreach (var info in sqlFile)
                    {
                        // コマンド生成
                        SqlCeCommand command = new SqlCeCommand(ReadSQLFile(sqlFile, Encoding.UTF8), db.Con);

                        if (paramDic != null && paramDic.Count > 0)
                        {
                            // パラメータを作成しコマ-ンドに設定
                            foreach (var key in paramDic.Keys)
                            {
                                command.Parameters.Add(new SqlCeParameter(String.Format(FMT_PAREM, key), paramDic[key]));
                            }
                        }
                    }

                    //DBの更新確定
                    db.Commit();
                    //成功
                    ret = true;

                }
                catch
                {
                    //DBの更新なし
                    db.Rollback();
                    //失敗
                    ret = false;

                }

                return ret;

            }
        }

        #endregion
    }
}
